/**
 * 解析键名并构建嵌套对象
 * @param {Object} flatObject - 扁平的对象
 * @returns {Object} - 嵌套的对象
 */
export function parseFlatObject(flatObject) {
  const nestedObject = {}

  Object.keys(flatObject).forEach((key) => {
    setValue(nestedObject, key, flatObject[key])
  })

  return nestedObject
}

/**
 * 设置对象中指定路径的值
 * @param {Object} obj - 目标对象
 * @param {string} path - 路径字符串，使用点分隔，如 'list[0].name'
 * @param {*} value - 要设置的值
 */
function setValue(obj, path, value) {
  const keys = path.split('.') // 将路径字符串分割成数组

  keys.reduce((acc, key, index) => {
    const match = key.match(/(\w+)\[(\d+)\]/) // 匹配数组格式的路径
    if (match) {
      const [, arrKey, arrIndex] = match // 解构匹配结果
      if (!acc[arrKey]) {
        acc[arrKey] = [] // 如果数组不存在，则创建一个新的数组
      }
      if (index === keys.length - 1) {
        acc[arrKey][parseInt(arrIndex, 10)] = value // 如果是路径的最后一个键，设置值
      } else {
        if (!acc[arrKey][parseInt(arrIndex, 10)]) {
          acc[arrKey][parseInt(arrIndex, 10)] = {} // 如果中间对象不存在，则创建一个新的对象
        }
        return acc[arrKey][parseInt(arrIndex, 10)] // 返回数组中的对象，继续下一个键的处理
      }
    } else {
      if (index === keys.length - 1) {
        acc[key] = value // 如果是路径的最后一个键，设置值
      } else {
        if (!acc[key]) {
          acc[key] = {} // 如果中间对象不存在，则创建一个新的对象
        }
        return acc[key] // 返回对象中的值，继续下一个键的处理
      }
    }
    return acc
  }, obj)
}
